PostgreSQL 安全管理 行级安全性

1 环境准备

CREATE USER u01;
CREATE USER u02;
CREATE TABLE t_user(id int ,name varchar(100),dept int);
CREATE POLICY p1 On t_user TO u01 USING (dept = 1);
CREATE POLICY p2 ON t_user TO u02 USING (dept = 2);
GRANT ALL ON t_user TO u01,u02;
INSERT INTO t_user VALUES(1,'aa',1);
INSERT INTO t_user VALUES(2,'bb',1);
INSERT INTO t_user VALUES(3,'cc',2);
INSERT INTO t_user VALUES(4,'dd',3);

2 未开启行级安全性


\c - u01;
SELECT * FROM t_user;
\c - u02;
SELECT * FROM t_user;
Note

未开启行级安全性时,可以看到所有数据

3 开启行级安全性

\c - postgres
ALTER TABLE t_user ENABLE ROW LEVEL SECURITY;

\c - u01;
SELECT * FROM t_user;
\c - u02;
SELECT * FROM t_user;
Warning

只能看到符合安全策略的行。
1、u01 能看到两行,同为部门1.
2、u02 能看到一行,同为部门2。

4 对于拥有者的行级安全性

4.1 对于拥有者,行级安全性失效。

\c - postgres
ALTER TABLE t_user OWNER TO u01;
\c - u01;
SELECT * FROM t_user;

4.2 如果要对拥有者也生效,请执行以下命令

\c - postgres
ALTER TABLE t_user FORCE ROW LEVEL SECURITY;
\c - u01;
SELECT * FROM t_user;

更多参考文档请见官方文档